#include "c.h"
#include "assert.h"

#ifndef SCREEN_W
#define SCREEN_W 800
#endif

#ifndef SCREEN_H
#define SCREEN_H 400
#endif

extern Uint8 *screen_pixeles;

void blit(Uint8 *imagen, Uint32 ancho_imagen, Uint32 alto_imagen, Uint32 x, Uint32 y, Color rgb)
{
	//Alineamos el ancho de la pantalla a 4 bytes
	Uint32 ancho_pantalla_bytes = (Uint32)(SCREEN_W * 3);
	Uint32 resto = ancho_pantalla_bytes % 4;
	if(resto != 0) ancho_pantalla_bytes += 4 - resto;
	assert(ancho_pantalla_bytes % 4 == 0);

	//Alineamos el ancho de la imagen a 4 bytes
	Uint32 ancho_imagen_bytes = (Uint32)(ancho_imagen * 3);
	resto = ancho_imagen_bytes % 4;
	if(resto != 0) ancho_imagen_bytes += 4 - resto;
	assert(ancho_imagen_bytes % 4 == 0);

	Uint32 bytes_hasta_primera_columna = (Uint32)(x * 3);
	Uint32 bytes_hasta_primera_fila = (Uint32)(ancho_pantalla_bytes * y);

	Uint8* p_fila_imagen = imagen;
	Uint8* p_fila_pantalla = screen_pixeles + bytes_hasta_primera_fila + bytes_hasta_primera_columna;

	Uint8* p_columna_imagen;
	Uint8* p_columna_pantalla;

	for(Uint32 fila = 0; fila < alto_imagen; fila++)
	{
		p_columna_pantalla = p_fila_pantalla;
		p_columna_imagen = p_fila_imagen;

		for(Uint32 columna = 0; columna < ancho_imagen; columna++)
		{
			for(Uint32 pixel = 0; pixel < 3; pixel++)
			{
				if(pixel == 2)
				{
					if(rgb.b == *p_columna_imagen &&
					   rgb.g == *(p_columna_imagen-1) &&
					   rgb.r == *(p_columna_imagen-2))
					{
						*(p_columna_imagen-2) = *(p_columna_pantalla-2);
						*(p_columna_imagen-1) = *(p_columna_pantalla-1);
						*(p_columna_imagen) = *(p_columna_pantalla);						
					}
				}
				p_columna_pantalla++;
				p_columna_imagen++;
			}
		}

		p_fila_pantalla+= ancho_pantalla_bytes;
		p_fila_imagen+= ancho_imagen_bytes;
	}
}
